\section{Atributos de calidad: escenarios y relación en la arquitectura}
%template
%\begin{itemize}
%\item[\textbf{Fuente:}]
%\item[\textbf{Estímulo:}]
%\item[\textbf{Artefacto:}]
%\item[\textbf{Entorno:}]
%\item[\textbf{Respuesta:}]
%\item[\textbf{Medida:}]
%\end{itemize}

\subsection{Modificabilidad/Flexibilidad}

\begin{itemize}
\item[\textbf{Fuente:}] Usuario
\item[\textbf{Estímulo:}] Se utiliza cualquier funcionalidad de la aplicación en un dispositivo provisto
por un nuevo proveedor.
\item[\textbf{Artefacto:}] Sistema(Adaptador de Drivers de Anteojos)
\item[\textbf{Entorno:}] Normal
\item[\textbf{Respuesta:}] La funcionalidad satisface su comportamiento interactuando con el nuevo dispositivo.
\item[\textbf{Medida:}] El 90\% de los dispositivos de diferentes proveedores es compatible con la funcionalidad de la aplicación.
\item[\textbf{Cumplimiento:}] Dado que contamos con el componente \textbf{Adaptador de Drivers de Anteojos} que tiene como responsabilidad saber cómo hablar con los diferentes anteojos que existen en el mercado, en caso de agregarse un nuevo proveedor que hable de forma diferente, debemos colocar la lógica de traducción sólo en este módulo.
\end{itemize}

\subsection{Modificabilidad/Extensibilidad}
\begin{itemize}
 \item[\textbf{Fuente:}] Desarrollador
 \item[\textbf{Estímulo:}] Se quiere agregar un nuevo servicio de reconocimiento de comando de voz al usuario mientras
 se está desarrollando la carrera.
 \item[\textbf{Artefacto:}] Sistema(Reconocedor de Comandos de Voz)
 \item[\textbf{Entorno:}] En ejecución	
 \item[\textbf{Respuesta:}] Se agrega la nueva funcionalidad satisfactoriamente.
 \item[\textbf{Medida:}] Los módulos afectados a la inclusión de dicha funcionalidad representa sólo el 0.05\% del total.
 \item[\textbf{Cumplimiento:}] El componente encargado de reconocer si un comando de voz es válido o no y si lo es enviar a que se ejecute es el \textbf{Reconocedor de Comandos de Voz}, por lo que si deseamos incluir un nuevo comando de voz, debemos modificar este componente y agregar la lógica de le ejecución de dicho comando en alguno de los componentes que existen o bien crear un nuevo componente con dicha lógica. Si la lógica ya existía previamente y es sólo agregar la posibilidad de que el comando se pueda acceder por voz, entonces el cambio es aún menor, agregando el mapeo simplemente en el primer componente mencionado.
\end{itemize}

\begin{itemize}
 \item[\textbf{Fuente:}] Desarrollador
 \item[\textbf{Estímulo:}] Se finalizó el desarrollo de las funcionalidades básicas del sistema.
 \item[\textbf{Artefacto:}] Sistema(funcionalidades API)
 \item[\textbf{Entorno:}] Normal, en tiempo de diseño.
 \item[\textbf{Respuesta:}] La funcionalidad básica se encapsula en una API.
 \item[\textbf{Medida:}] Toda la funcionalidad básica del sistema está encapsulada en una API.
 \item[\textbf{Cumplimiento:}] La componente \textbf{funcionalidades API} es la encargada de proveer servicios básicos de la aplicación.
Si se quiere agregar algo se debe modificar la API pero no en tiempo de ejecución.

\end{itemize}

\subsection{Modificabilidad/Extensibilidad}

\begin{itemize}
 \item[\textbf{Fuente:}] Desarrollador
 \item[\textbf{Estímulo:}] Se solicita la interacción con un nuevo dispositivo.
 \item[\textbf{Artefacto:}] Adaptador de Otros Dispositivos
 \item[\textbf{Entorno:}] En desarrollo
 \item[\textbf{Respuesta:}] La aplicación interactúa correctamente con el nuevo dispositivo.
 \item[\textbf{Medida:}] La aplicación funciona al 90\% en el 75\% de los dispositivos probados y los componentes modificados no supera el 1\%.
 \item[\textbf{Cumplimiento:}] A través del componente \textbf{Adaptador de Otros Dispositivos}, se cumple este atributo de calidad, si el dispositivo con el que queremos interactuar va a enviarnos datos a nuestro sistema, como por ejemplo, un sensor de pulso, o de oxígeno, entonces enviará su mensaje por el \textbf{Adaptador Dispositivos Input}, acá tendremos que escribir la lógica para traducir el mensaje que nos envía a nuestro sistema y luego irá al \textbf{Dispatcher de Servicios} que hará algo con dicho mensaje como por ejemplo mostrarlo por pantalla o si debe hacer algo especial, entonces deberemos escribir esa lógica en otro componente pero no afectaremos a ninguno de los ya existentes, o la afección será mínima.\\
Si el dispositivo es para que le enviemos datos desde nuestro sistema, entonces deberemos agregar la lógica para traducir nuestro mensaje al del nuevo dispositivo en el componente \textbf{Adaptador Dispositivos Output} y configurar dentro del \textbf{Selector de Salida} cuáles son las funcionalidades que queremos mostrar en dicho dispositivo.\\
Como se observa, el impacto de agregar interacción con un nuevo dispositivo es mínimo.
\end{itemize}

\subsection{Usabilidad/Accesibilidad}

\begin{itemize}
 \item[\textbf{Fuente:}] Usuario
 \item[\textbf{Estímulo:}] Se declara dificultad para leer información de la pantalla. 
 \item[\textbf{Artefacto:}] Sistema(interfaz gráfica de usuario-administrador de configuración)
 \item[\textbf{Entorno:}] Normal
 \item[\textbf{Respuesta:}] El sistema pasa a estar en modo de accesibilidad por comando de voz y/o táctil.
 \item[\textbf{Medida:}] El 100\% de los casos donde el usuario declara dificultades con la lectura desde la pantalla,
 el sistema comienza a actuar en dicho modo de accesibilidad.
 \item[\textbf{Cumplimiento:}] En cualquier momento el usuario puede acceder, mediante el menú gráfico de la aplicación o bien por comando de voz a otro modo de accesibilidad. El sistema preguntará a que modo  desea cambiar proporcionando los modos que posee actualmente que son: por comando de voz, o por interfaz gráfica, la última puede ser en modo normal o bien en modo de imágenes reducidas, para aquellos usuarios que tienen inconvenientes al tocar botones o teclados por tener dedos grandes o bien porque la pantalla de su celular es muy pequeña.\\
Al seleccionar el modo, según lo elegido, o bien cambia el aspecto de la interfaz gráfica o bien se envían indicaciones por el micrófono tal como se describe en el Caso de Uso 5.
\end{itemize}

\begin{itemize}
\item[\textbf{Fuente:}] Usuario
\item[\textbf{Estímulo:}] Se solicita una funcionalidad del sistema expresada por comando de voz.
\item[\textbf{Artefacto:}] Sistema(procesador comandos de voz- reconocedor comando de voz).
\item[\textbf{Entorno:}] En modo accesibilidad por comando de voz.
\item[\textbf{Respuesta:}] El sistema comienza a ejecutar las funcionalidades mediante comandos de voz.
\item[\textbf{Medida:}] El 100\% de las funcionalidades que pueden ser accedidas por interfaz gráfica  pueden ser accedidas también por comando de voz.
\item[\textbf{Cumplimiento:}] El correcto funcionamiento de lo mencionado recae en que todas las funcionalidades que se presentan en el menú gráfico, están incluidas en el componente \textbf{Reconocedor de Comandos de Voz}, esta es la forma de cumplir este atributo de calidad.
\end{itemize}

\subsection{Usabilidad}

\begin{itemize}
 \item[\textbf{Fuente:}] Externa
 \item[\textbf{Estímulo:}] Se envía un mensaje de indicaciones al corredor.
 \item[\textbf{Artefacto:}] Sistema(Filtrador de Mensajes-selector interfaz de salida)
 \item[\textbf{Entorno:}] En ejecución, en modo corredor profesional.	
 \item[\textbf{Respuesta:}] Se visualiza el mensaje con la indicación recibida en los anteojos y no es interferida por otros
 mensajes de menor prioridad tales como publicidad, o mensajes informativos.
 \item[\textbf{Medida:}] El 98\% de los mensajes con indicaciones enviados se visualizan con prioridad de ubicación en los anteojos.
 \item[\textbf{Cumplimiento:}] Los mensajes se reciben a través de las redes sociales, como cualquier otro mensaje, pero al pasar por el componente \textbf{Filtrador de Mensajes}, éste comprobará la configuración de la aplicación, consultándole al componente \textbf{Administrador de Configuración}, verá que está en modo corredor profesional y entonces sólo permitirá pasar a la \textbf{Selector de Salida} aquellos mensajes que provengan de su coach.\\
Nótese que la información que se encuentra configurada en el \textbf{Administrador de Configuración} se obtiene cuando inicia la aplicación, consultándole al corredor en que modo accederá y eventualmente le consultará datos tales como la identificación de su coach. Para mas detalle de este funcionamiento, ver el Caso de Uso .
\end{itemize}

\subsection{Usabilidad}

\begin{itemize}
 \item[\textbf{Fuente:}] Interna
 \item[\textbf{Estímulo:}] Se envía una publicidad al usuario.
 \item[\textbf{Artefacto:}] Gestor de Publicidad
 \item[\textbf{Entorno:}] En ejecución, ejecutando un entrenamiento.
 \item[\textbf{Respuesta:}] Se visualiza la publicidad en alguna de las interfases visuales, por ejemplo, los anteojos de realidad aumentada.
 \item[\textbf{Medida:}] Ninguna de las publicidades interfieren la visualización del corredor ni de ninguno de los otros mensajes importantes o menús del sistema.
 \item[\textbf{Cumplimiento:}] El \textbf{Selector de Salida} cuando envía la publicidad ya filtrada al dispositivo que la mostrará, le pasa la ubicación y tamaño acorde al lugar donde la representará para que no moleste ni altere la visión del corredor.
\end{itemize}

\subsection{Performance}

\begin{itemize}
 \item[\textbf{Fuente:}] Usuario	
 \item[\textbf{Estímulo:}] El usuario avanza en su recorrido.
 \item[\textbf{Artefacto:}] Sistema
 \item[\textbf{Entorno:}] Normal
 \item[\textbf{Respuesta:}] El avance del usuario es visualizado en sus redes sociales configuradas en tiempo real.
 \item[\textbf{Medida:}] El 95\% de las publicaciones tienen una latencia menor a 5 segundos desde que se identifica una nueva posición.
\item[\textbf{Cumplimiento:}] El \textbf{administrador de entrenamiento} publica la información del entrenamiento al 
\textbf{publicador de redes sociales} que además de recibir la posición del \textbf{actualizador de posición} reúne esa información
rápidamente. Todo esto puede hacerse en menos de un segundo porque las posiciones pueden obtenerse del Gps en tiempo real
el \textbf{administrador de entrenamiento} es un proceso que computa cosas simples y además ya tiene las información a medida que monitorea.
Luego la mayor parte del tiempo de cómputo se consume en el \textbf{adaptador de redes sociales} que parsea la info en un mensaje 
publicable. Dicho mensaje (string) puede publicarse en a lo sumo 3 segundos usando la API de la red social.
\end{itemize}

\begin{itemize}
 \item[\textbf{Fuente:}] Interna
 \item[\textbf{Estímulo:}] Se obtiene información del corredor y/o su entrenamiento.
 \item[\textbf{Artefacto:}] Sistema
 \item[\textbf{Entorno:}] Normal
 \item[\textbf{Respuesta:}] Se almacena la información del corredor y su entrenamiento.
 \item[\textbf{Medida:}] La información se almacena en menos de 5 segundos.
 \item[\textbf{Cumplimiento:}] Cuando se actualiza la posición del corredor a través del componente \textbf{Actualizador de Posición}, el nuevo valor obtenido es inmediatamente enviado al componente \textbf{Calculador Datos Corredor} que a través de la nueva posición y los datos anteriores, calcula la velocidad, kilómetros recorridos y todos aquellos datos que se puedan. A medida que los va obteniendo los envía al componente \textbf{Auditor de Entrenamientos} que es el que se comunica con OpenStack para finalmente guardarlos.\\
Dado que además de la performance nos piden seguridad en este punto respecto a los datos del corredor, entonces el algoritmo que hemos elegido para encriptar no es el que nos plantean ya que no conocemos cómo actúa ni nos pueden asegurar el tiempo que tarde en encriptar estos datos. Por lo tanto hemos usado un algoritmo que realiza la encriptación en un tiempo promedio de 1 segundo por dato. Cabe mencionar que si bien la comunicación entre alguno de los componentes es mediante colas porque no queremos perder ningún mensaje ya que todos los datos son importantes para analizar, la ejecución es breve y el overhead de encolar-desencolar es despreciable.
Por último, el \textbf{Calculador Datos Corredor} levanta una nueva posición de la cola y como son varias cosas las que calcula y todas son independientes, trabaja con multihilos para procesar todo en paralelo, garantizado mejor performance.
\end{itemize}

\subsection{Seguridad/Auditabilidad}

\begin{itemize}
 \item[\textbf{Fuente:}] Interna
 \item[\textbf{Estímulo:}] Se recibe información del corredor y/o su entrenamiento.	
 \item[\textbf{Artefacto:}] Auditor de Entrenamiento
 \item[\textbf{Entorno:}] Normal, con el sistema de OpenStack funcionado correctamente.	
 \item[\textbf{Respuesta:}] La información se almacena en el sistema correctamente.
 \item[\textbf{Medida:}] El 100\% de la información recibida es almacenada en el sistema.
 \item[\textbf{Cumplimiento:}] A través de otro componentes que recolectan y calculan información, estos datos le llegan al \textbf{Auditor de Entrenamiento} que sabe hablar con el OpenStack que es un componente externo a nuestro sistema, como el mismo está funcionando correctamente, se almacena la información sin inconvenientes.
\end{itemize}

\subsection{Seguridad}

\begin{itemize}
 \item[\textbf{Fuente:}] Interna
 \item[\textbf{Estímulo:}] Se recibe información del corredor y/o su entrenamiento.	
 \item[\textbf{Artefacto:}] Auditor de Entrenamiento
 \item[\textbf{Entorno:}] Normal	
 \item[\textbf{Respuesta:}] La información se almacena en el sistema.
 \item[\textbf{Medida:}] El 100\% de la información recibida es encriptada.
 \item[\textbf{Cumplimiento:}] Esto lo logramos con el conector custom que hemos desarrollado que encripta la información del corredor antes de enviarla al OpenStack, cumplimos con este atributo de seguridad.
\end{itemize}


\subsection{Disponibilidad}

\begin{itemize}
 \item[\textbf{Fuente:}] Externa
 \item[\textbf{Estímulo:}] El servidor donde corre el Manager de Entrenamientos colapsa y no puede recibir más mensajes.
 \item[\textbf{Artefacto:}] Manager de Entrenamientos
 \item[\textbf{Entorno:}] Servidor sobrecargado
 \item[\textbf{Respuesta:}] El usuario puede seguir usando la aplicación, pero deja de recibir mensajes y actualizaciones de posiciones de los amigos. Las posiciones recorridas se guardan localmente y son enviadas al Manager de Entrenamientos cuando éste esté disponible nuevamente.
 \item[\textbf{Medida:}] La aplicación puede guardar recorridos de hasta 5 minutos localmente sin acceder al Manager cuando este está caído. Pasado ese tiempo se puede seguir usando la aplicación pero no se asegura que el recorrido sea enviado completo en el futuro.
 \item[\textbf{Cumplimiento:}] Logramos cumplir con este atributo usando el componente Verificador de Disponibilidad, por el que pasan todas las actualizaciones de posición al Manager de Entrenamientos externo. Dicho verificador se encarga de guardar las posiciones en el repositorio Buffer en vez de enviarlas al Manager si nota que no puede establecer una conexión.
\end{itemize}



